package com.hotec.PROJECT_NAME.utils;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.gemcap.framework.common.utils.UtilsDate;
import com.hotec.PROJECT_NAME.component.exception.exc.BizException;
import io.minio.MinioClient;
import io.minio.policy.PolicyType;
import lombok.SneakyThrows;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.Date;

/**
 * @author zb
 * @date 2019/12/15 14:20
 * @Description: Copyright (C),2019,AOSSCI Inc.傲势科技有限公司
 * Endpoint	对象存储服务的URL
 * Access key就像用户ID，可以唯一标识你的账户。
 * Secret key是你账户的密码。
 */
@Component
public class FileService {

    /**
     * 对象存储服务的URL, 注意 这里的endpoint填写 url会报错，这里endpoint的值应该为 【 http://ip:端口号 】 的形式
     */
    private static String endpoint;

    /**
     * 就像用户ID，可以唯一标识你的账户
     */
    private static String accessKey;

    /**
     * 是你账户的密码
     */
    private static String secretKey;

    // 上传的最大限制 10 M
    private static final long MAX_SIZE = 1024 * 1024 * 100L;

    @Value("${minio.endpoint}")
    public void setEndpoint(String endpoint) {
        FileService.endpoint = endpoint;
    }

    @Value("${minio.accessKey}")
    public void setAccessKey(String accessKey) {
        FileService.accessKey = accessKey;
    }

    @Value("${minio.secretKey}")
    public void setSecretKey(String secretKey) {
        FileService.secretKey = secretKey;
    }

    /**
     * 上传图片
     *
     * @param bucketName 桶名称
     * @param file       文件
     * @return
     * @throws Exception
     */
    public static String uploadImage(String bucketName, MultipartFile file) throws Exception {
        String contentType = file.getContentType();
        // image/png
        if (!StrUtil.containsAny(contentType, "image")) {
            throw new BizException("文件类型错误，请上传图片文件。");
        }
        return uploadFile(bucketName, file, "image");
    }

    /**
     * 上传文件
     *
     * @param bucketName 桶名
     * @param file       文件
     * @return
     * @throws Exception
     */
    public static String uploadFile(String bucketName, MultipartFile file) throws Exception {
        String contentType = file.getContentType();
        return uploadFile(bucketName, file, contentType);
    }

    /**
     * 上传文件
     *
     * @param bucketName 桶的名称
     * @param file       文件名
     * @param prefix     前缀
     * @return
     * @throws Exception
     */
    public static String uploadFile(String bucketName, MultipartFile file, String prefix) throws Exception {
        if (file.getSize() > MAX_SIZE) {
            throw new BizException("文件过大，超过限制大小：" + MAX_SIZE / (1024 * 1024.0) + " M");
        }
        MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);
        minioClient.setBucketPolicy(bucketName, prefix, PolicyType.READ_WRITE);
        // 检查桶是否存在，若不存在则创建一个
//        if (!minioClient.bucketExists(bucketName)) {
//            minioClient.makeBucket(bucketName);
//        }
        InputStream inputStream = file.getInputStream();
        String contentType = file.getContentType();
        String filename = file.getOriginalFilename();
        String fileUrl = UtilsDate.formatDate(new Date(), new Object[0]) ;
        String objectName = prefix+"/"+fileUrl + "/" + IdUtil.fastUUID()+"." +FilenameUtils.getExtension(filename);
//        String objectName = prefix+"/"+fileUrl + "/" + filename;

        // 上传文件
        minioClient.putObject(bucketName, objectName, inputStream, contentType);
        return "/__minio/" + bucketName + "/" + objectName;
    }

    @SneakyThrows
    public static InputStream getInputStreamByUrl(String url) {
        MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);
        String objectName = url.replaceAll(endpoint, "").replaceAll("/__minio", "").replaceAll("/unionpay/", "");
        return minioClient.getObject("unionpay", objectName);
    }
}